//
// Created by hsj on 2023-12-29.
// ！！！window平台代码，Windows MinGW64编译！！！
// 编译：gcc hello_serve_win.c -LH:\mingw\mingw64\x86_64-w64-mingw32\lib -lws2_32 -o hello_serve_win
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>

#include <winsock2.h>
#include <ws2tcpip.h>

void ErrorHandling(char *message);

int main(int argc, char *argv[]){
    char port[]="6788";
    WSADATA wsaData;
    SOCKET hServSock, hClntSock;
    SOCKADDR_IN servAddr, clntAddr;

    int szClntAddr;
    char message[]="Hello World!";

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) !=0)
        ErrorHandling( "WSAStartup() error!");

    hServSock=socket(PF_INET, SOCK_STREAM,0);
    if (hServSock==INVALID_SOCKET )
        ErrorHandling(" socket() error" );

    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family=AF_INET;
    servAddr.sin_addr.s_addr=htonl (INADDR_ANY);
    servAddr.sin_port=htons(atoi(/*argv[1]*/port));//2字节最大65535，端口最大65535，int转u_short不存在丢失精度//网络字节流大端
    printf("service listen on port: %s\n",port);

    if(bind(hServSock,(SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR) {
        ErrorHandling( "bind() error");
    }
    if(listen(hServSock, 128)==SOCKET_ERROR) {
        ErrorHandling( "listen() error");
    }

    szClntAddr=sizeof(clntAddr);
    hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr);
    if(hClntSock==INVALID_SOCKET)
        ErrorHandling("accept() error");

    send(hClntSock, message, sizeof(message), 0);
    closesocket(hClntSock) ;
    closesocket(hServSock) ;
    WSACleanup();

    return EXIT_SUCCESS;
}

void ErrorHandling( char *message){
    fputs (message, stderr);
    fputc('\n', stderr);
    exit(1);
}
